package modelo.carrera.tests;

import static org.junit.Assert.*;
import org.junit.Test;

import modelo.carrera.Conductor;
import modelo.carrera.Infraccion;
import modelo.carrera.Jugador;
import modelo.comportamiento.Comportamiento;
import modelo.comportamiento.Conciencia;
import modelo.geometria.Vector;
import modelo.vehiculos.Automovil;
import modelo.vehiculos.SentidoVehiculo;
import modelo.vehiculos.Vehiculo;

public class TestInfraccion {
	
	@Test
	public void TestSacarPunto(){
		
		int puntos;
		
		Comportamiento comportamiento = new Comportamiento(new Conciencia());
		Conductor conductor = new Conductor(comportamiento);
	
		Vector posicionAuto_PaseoColon_Chile = new Vector(12,18);
		SentidoVehiculo sentidoVehiculo = SentidoVehiculo.NORTE;
		double ancho = 2;
		double largo = 3;
		Vehiculo vehiculo = new Automovil(conductor,posicionAuto_PaseoColon_Chile, posicionAuto_PaseoColon_Chile ,sentidoVehiculo, largo, ancho, 30,100,5,50);
		Jugador jugador = new Jugador("Jugador 1",vehiculo);
		
		puntos = jugador.getVehiculo().getConductor().getPuntos();
		assertEquals(puntos, 15);
		
		jugador.getVehiculo().addInfraccion(new Infraccion(0,1, 3));
		jugador.getVehiculo().addInfraccion(new Infraccion(0,1, 2));
		jugador.actualizar();
		
		puntos = jugador.getVehiculo().getConductor().getPuntos();
		assertEquals(puntos, 10);

	}

	@Test
	// El conductor no cometio ninguna infraccion
	public void testNoInfraccion(){
		
		int puntos;
		Comportamiento comportamiento = new Comportamiento(new Conciencia());
		Conductor conductor = new Conductor(comportamiento);
		Vector posicionAutoInicial = new Vector(50,10);
		Vector posicionAutoFinal = new Vector(50,30);
		SentidoVehiculo sentidoVehiculo = SentidoVehiculo.NORTE;
		double ancho = 2;
		double largo = 3;
		double velocidadActual = 30;
		double velocidadMaxima = 100;
		double aceleracionMaxima = 5;
		double frenadoMaximo = 50;
		Vehiculo vehiculo = new Automovil(conductor,posicionAutoInicial, posicionAutoFinal, sentidoVehiculo, largo, ancho, velocidadActual, velocidadMaxima, aceleracionMaxima, frenadoMaximo);
		Jugador jugador =   new Jugador("Jugador Sin Infraccion",vehiculo);

		jugador.actualizar();
		
		puntos = jugador.getVehiculo().getConductor().getPuntos();
		assertEquals(puntos, 15);
		assertEquals(jugador.isActivo(),true);	
		
	}
	
	@Test
	public void testNoContinuarCarrera(){
		
		int puntos;
		Comportamiento comportamiento = new Comportamiento(new Conciencia());
		Conductor conductor = new Conductor(comportamiento);
	
		Vector posicionAutoInicial = new Vector(50,10);
		Vector posicionAutoFinal = new Vector(50,30);
		SentidoVehiculo sentidoVehiculo = SentidoVehiculo.NORTE;
		double ancho = 2;
		double largo = 3;
		double velocidadActual = 30;
		double velocidadMaxima = 100;
		double aceleracionMaxima = 5;
		double frenadoMaximo = 50;
		
		Vehiculo vehiculo = new Automovil(conductor,posicionAutoInicial, posicionAutoFinal, sentidoVehiculo, largo, ancho, velocidadActual, velocidadMaxima, aceleracionMaxima, frenadoMaximo);
		Jugador jugador =  new Jugador("Jugador Fuera Carrera",vehiculo);
		jugador.getVehiculo().addInfraccion(new Infraccion(0, 1, 3));
		jugador.getVehiculo().addInfraccion(new Infraccion(0,1, 10));
		jugador.actualizar();
	
		puntos = jugador.getVehiculo().getConductor().getPuntos();
		
		//Primer test: le quedan dos puntos
		assertEquals(puntos, 2);
		assertEquals(jugador.isActivo(),true);
	
		// Una nueva infraccion de 2 puntos
		jugador.getVehiculo().addInfraccion(new Infraccion(0,1, 2));
		jugador.actualizar();
		puntos = jugador.getVehiculo().getConductor().getPuntos();
		assertEquals(puntos, 0);
	}
}
